<?php
// +----------------------------------------------------------------------
// | 微擎 TP6.0 框架 计算相关方法
// +----------------------------------------------------------------------
// | Author: liang 23426945@qq.com
// +----------------------------------------------------------------------

declare(strict_types=1);

namespace app\common\lib;

class Math
{
    /**
     * 精确减法
     *
     * @param $minuend    被减数
     * @param $subtrahend 减数
     */
    public static function sub($minuend, $subtrahend)
    {
        $minuend    = sprintf('%.2f', $minuend);
        $subtrahend = sprintf('%.2f', $subtrahend);
        return floatval(bcsub($minuend, $subtrahend, 2));
    }

    /**
     * 生成随机浮点数并保留两位小数点
     *
     * @param $min 随机返回最小值
     * @param $max 随机范围最大值
     */
    public static function randFloat($min = 0, $max = 1)
    {
        $rand = $min + mt_rand() / mt_getrandmax() * ($max - $min);
        return floatval(round($rand, 2));
    }

    /**
     * 阿拉伯数字转为中文数字
     *
     * @param int $num
     */
    public static function numToWord(int $num)
    {
        $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
        $chiUni = array('', '十', '百', '千', '万', '十', '百', '千', '亿');
        $chiStr = '';
        $num_str = (string)$num;
        $count = strlen($num_str);
        $last_flag = true; //上一个 是否为0
        $zero_flag = true; //是否第一个
        $temp_num = null; //临时数字
        $chiStr = ''; //拼接结果
        if ($count == 2) { //两位数
            $temp_num = $num_str[0];
            $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num] . $chiUni[1];
            $temp_num = $num_str[1];
            $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num];
        } else if ($count > 2) {
            $index = 0;
            for ($i = $count - 1; $i >= 0; $i--) {
                $temp_num = $num_str[$i];
                if ($temp_num == 0) {
                    if (!$zero_flag && !$last_flag) {
                        $chiStr = $chiNum[$temp_num] . $chiStr;
                        $last_flag = true;
                    }

                    if ($index == 4 && $temp_num == 0) {
                        $chiStr = "万" . $chiStr;
                    }
                } else {
                    if ($i == 0 && $temp_num == 1 && $index == 1 && $index == 5) {
                        $chiStr = $chiUni[$index % 9] . $chiStr;
                    } else {
                        $chiStr = $chiNum[$temp_num] . $chiUni[$index % 9] . $chiStr;
                    }
                    $zero_flag = false;
                    $last_flag = false;
                }
                $index++;
            }
        } else {
            $chiStr = $chiNum[$num_str[0]];
        }
        return $chiStr;
    }

    /**
     * 计算两点地理坐标之间的距离
     * 
     * @param  $longitude1 起点经度
     * @param  $latitude1  起点纬度
     * @param  $longitude2 终点经度 
     * @param  $latitude2  终点纬度
     * @param  $unit       单位 1:米 2:公里
     * @param  $decimal    精度 保留小数位数
     */
    public function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit = 2, $decimal = 2)
    {
        $EARTH_RADIUS = 6370.996; // 地球半径系数
        $PI = 3.1415926;

        $radLat1 = $latitude1 * $PI / 180.0;
        $radLat2 = $latitude2 * $PI / 180.0;

        $radLng1 = $longitude1 * $PI / 180.0;
        $radLng2 = $longitude2 * $PI / 180.0;

        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;

        $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
        $distance = $distance * $EARTH_RADIUS * 1000;

        if ($unit == 2) {
            $distance = $distance / 1000;
        }
        return round($distance, $decimal);
    }
}
